package main

import (
	"log"
	"sync"

	"github.com/go-ini/ini"
)

/*
单例，调用包时直接读取包变量Config即可
log.Println(config.Ini)
log.Println(config.Ini.App.RunMode)
*/

//Appcfg 配置
type Appcfg struct {
	Appname  string
	RunMode  string //运行模式
	HTTPPort int
	HTTPDir  string //http的目录
}

// MysqlCfg 数据库配置
type MysqlCfg struct {
	Host        string
	Port        int
	User        string
	Password    string
	Db          string //数据库名称
	TablePrefix string //数据表名称的前缀
}

//IniConfig ini配置文件结构
type IniConfig struct {
	cfg *ini.File //ini配置文件变量
	Ver string
	App Appcfg
}

var (
	//INI 单例模式，直接调用本包的此变量
	INI *IniConfig

	once sync.Once
)

func init() {
	var (
		i   IniConfig
		err error
	)
	//读取配置文件
	i.cfg, err = ini.Load("config-server.ini")
	if err != nil {
		log.Fatal(2, "Fail to parse 'conf/app.ini': %v", err)
	}

	i.Ver = i.getver()
	i.App = i.getapp()
	//i.Mysql = i.getmysql()

	INI = &i

}

//Ver 配置文件中的版本号
func (i *IniConfig) getver() string {
	//读取无节点的Key
	ver := i.cfg.Section("").Key("ver").MustString("null")
	log.Println("Ver:", ver)
	return ver
}

//App 配置文件中的APP名称
func (i *IniConfig) getapp() (a Appcfg) {
	//读取节点下的key
	sec, err := i.cfg.GetSection("App")
	if err != nil {
		log.Fatal(2, "Fail to get section 'server': %v", err)
	}
	a.Appname = sec.Key("appname").String()
	a.RunMode = sec.Key("runmode").In("release", []string{"debug", "release"})
	a.HTTPPort = sec.Key("httpport").MustInt(80)
	a.HTTPDir = sec.Key("httpdir").MustString("./public")
	log.Println("App", a)
	return a
}

//Mysql mysql数据库
func (i *IniConfig) getmysql() (m MysqlCfg) {
	//读取节点下的key
	sec, err := i.cfg.GetSection("Mysql")
	if err != nil {
		log.Fatal(2, "Fail to get section 'server': %v", err)
	}
	m.Host = sec.Key("host").String()
	m.Port = sec.Key("port").MustInt(3306)
	m.User = sec.Key("user").String()
	m.Password = sec.Key("password").String()
	m.Db = sec.Key("db").String()
	m.TablePrefix = sec.Key("tableprefix").String()
	log.Println("Mysql Host:", m)
	return m
}

/*单例模式优雅写法
type singleton struct {
	Name string
}

var ins *singleton
var once sync.Once

func GetIns() *singleton {
	once.Do(func() {
		ins = &singleton{}
	})
	return ins
}
*/
